#include "stm32f10x.h" // Device header

// PWM频率：	Freq = CK_PSC / (PSC + 1) / (ARR + 1) = 50Hz(20ms)
// PWM占空比：	Duty = CCR / (ARR + 1)				  = 7.5%(1.5ms)
// PWM分辨率：	Reso = 1 / (ARR + 1) 				  = 0.00005

// PSC = 72 - 1
// ARR = 20000 - 1
// CCR = 1500

void PWM_Init(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);  // 开启时钟使能，外设TIM2
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIOA

    GPIO_InitTypeDef GPIO_InitStructure;                     // GPIO结构体初始化
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;         // GPIO模式：复用推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        // GPIO速率：最高输出速率 50MHz
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1 | GPIO_Pin_2; // GPIO引脚：PA1(TIM2_CH2)|PA2(TIM2_CH3)
    GPIO_Init(GPIOA, &GPIO_InitStructure);                   // GPIO初始化函数

    TIM_InternalClockConfig(TIM2); // 配置TIMx内部时钟

    TIM_TimeBaseInitTypeDef TIM_TimBaseInitStructure;                    // TIM输出比较初始结构定义
    TIM_TimBaseInitStructure.TIM_Prescaler         = 72 - 1;             // PSC值：时钟频率除数的预分频值
    TIM_TimBaseInitStructure.TIM_CounterMode       = TIM_CounterMode_Up; // 计数器模式：向上计数
    TIM_TimBaseInitStructure.TIM_Period            = 20000 - 1;          // ARR值：自动重装载寄存器周期的值
    TIM_TimBaseInitStructure.TIM_ClockDivision     = TIM_CKD_DIV1;       // 时钟分割
    TIM_TimBaseInitStructure.TIM_RepetitionCounter = 0;                  // 该参数仅对TIM1和TIM8有效
    TIM_TimeBaseInit(TIM2, &TIM_TimBaseInitStructure);                   // 初始化TIMx Time Base Unit外设

    TIM_OCInitTypeDef TIM_OCInitStructure1;                        // 定义结构体 TIM_OCInitStructure1
    TIM_OCStructInit(&TIM_OCInitStructure1);                       // 初始化OC结构体成员函数
    TIM_OCInitStructure1.TIM_OCMode      = TIM_OCMode_PWM1;        // 选择定时器模式
    TIM_OCInitStructure1.TIM_OutputState = TIM_OutputState_Enable; // 指定TIM输出比较状态
    TIM_OCInitStructure1.TIM_Pulse       = 0;                      // CCR值：要加载到捕获比较寄存器的脉冲值
    TIM_OCInitStructure1.TIM_OCPolarity  = TIM_OCPolarity_High;     // 输出极性
    TIM_OC2Init(TIM2, &TIM_OCInitStructure1);                      // 初始化TIM2 Channel 3
    TIM_OC3Init(TIM2, &TIM_OCInitStructure1);                      // 初始化TIM2 Channel 3

    TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); // 使能TIM2在CCR2上的预装载寄存器
    TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); // 使能TIM2在CCR2上的预装载寄存器

    TIM_Cmd(TIM2, ENABLE); // 启用或停用指定的TIM外设
}

void PWM_SetCompare2(uint16_t Compare2)
{
    TIM_SetCompare2(TIM2, Compare2); // 设置TIMx捕获比较2寄存器的值，即CCR值，占空比
    /*TIMx->CCR2 = Compare2*/
}

void PWM_SetCompare3(uint16_t Compare3)
{
    TIM_SetCompare3(TIM2, Compare3); // 设置TIMx捕获比较3寄存器的值，即CCR值，占空比
    /*TIMx->CCR3 = Compare3*/
}
